package bean;


import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;

public class Conexion implements Serializable {

	// La descripcion del driver de la BD
	private static String driver;
	// La direccion URL de la BD
	private static String url;
	// El nombre de la BD
	private static String nombreBd;
	// EL login del usuario para conectarse al servidor de BD
	private static String usuario;
	// EL password del usuario para conectarse al servidor de BD
	private static String password;
	// El nombre del archivo de properties, donde se encuentran los datos para
	// la conexión con la Base de Datos
	private static String archivoProperties;

	private static Connection conexion;

	/**
	 * Metodo utilizado para establecer los valores necesarios para la conexion
	 * con la Base de Datos
	 */
	public static void establecerPropiedadesConexion(String driver, String url,
			String nombreBd, String usuario, String password) {
		Conexion.driver = driver;
		System.out.println(driver);
		Conexion.url = url;
		System.out.println(url);

		Conexion.nombreBd = nombreBd;
		System.out.println(nombreBd);

		Conexion.usuario = usuario;
		Conexion.password = password;
	}

	/**
	 * Metodo que se encarga de leer los valores valores necesarios para la
	 * conexion con la Base de Datos, de un archivo de configuracion .properties
	 */
	public static void establecerPropiedadesConexion(String archivoProperties,
			String driver, String url, String nombreBd, String usuario,
			String password) {
		// Obtenemos de un archivo de configuracion .properties los valores de
		// conexion a la Base de Datos
		ResourceBundle bundle = ResourceBundle.getBundle(archivoProperties);

		// Obtenemos las propiedades del archivo de configuracion
		Conexion.driver = bundle.getString(driver);
		Conexion.url = bundle.getString(url);
		Conexion.nombreBd = bundle.getString(nombreBd);

		Conexion.usuario = bundle.getString(usuario);
		Conexion.password = bundle.getString(password);
		System.out.println(Conexion.nombreBd);
		System.out.println(Conexion.usuario);
		System.out.println(Conexion.password);
	}

	/**
	 * @return driver
	 */
	public static String getDriver() {
		return driver;
	}

	/**
	 * @param driver
	 */
	public static void setDriver(String driver) {
		Conexion.driver = driver;
	}

	/**
	 * @return url
	 */
	public static String getUrl() {
		return url;
	}

	/**
	 * @param url
	 */
	public static void setUrl(String url) {
		Conexion.url = url;
	}

	/**
	 * @return bd
	 */
	public static String getNombreBd() {
		return nombreBd;
	}

	/**
	 * @param bd
	 */
	public static void setNombreBd(String nombreBd) {
		Conexion.nombreBd = nombreBd;
	}

	/**
	 * @return usuario
	 */
	public static String getUsuario() {
		return usuario;
	}

	/**
	 * @param usuario
	 */
	public static void setUsuario(String usuario) {
		Conexion.usuario = usuario;
	}

	/**
	 * @return password
	 */
	public static String getPassword() {
		return password;
	}

	/**
	 * @param password
	 */
	public static void setPassword(String password) {
		Conexion.password = password;
	}

	/**
	 * Metodo utilizado para Obtener una conexion a BD
	 * 
	 * @return Un objeto tipo Connection que representa una conexion a la BD
	 */
	private static Connection getConexion() {
		try {
			if (conexion == null || conexion.isClosed()) {
				// Cargo el driver en memoria
				Class.forName(driver);
				// Establezco la conexion
				conexion = DriverManager.getConnection(url + nombreBd, usuario,
						password);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return conexion;
	}

	/**
	 * * Metodo consultar
	 * 
	 * @param String
	 *            tiraSQL
	 * @return ResultSet
	 */
	public static ResultSet consultar(String tiraSQL) {
		getConexion();
		ResultSet resultado = null;
		try {
			Statement sentencia = conexion.createStatement();
			resultado = sentencia.executeQuery(tiraSQL);
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			conexion.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return resultado;
	}

	/**
	 * * Metodo ejecutar
	 * 
	 * @param String
	 *            TiraSQL
	 * @return boolean
	 */
	public static boolean ejecutar(String tiraSQL) {
		getConexion();
		boolean ok = false;
		try {
			Statement sentencia = conexion.createStatement();
			int i = sentencia.executeUpdate(tiraSQL);
			if (i > 0) {
				ok = true;
			}
			sentencia.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			conexion.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return ok;
	}
}